class Person:
    name = "mengxingyun"
    __age = "18"  # 私有属性，不可被继承，from ... import * 不会被引入
    _sex = "男"  # protected属性，可以被继承，但是from ... import * 不会被引入

    @classmethod
    def getAge(cls):
        return cls.__age

    @classmethod
    def __privateMethod(cls):
        print("这是私有方法")

    @classmethod
    def invokePrivateMethodByClassMethod(cls):
        cls.__privateMethod()

    def invokePrivateMethodByInstanceMethod(self):
        self.__privateMethod()

    def _protectedMethod(self):
        print("这是受保护的方法")



if __name__ == "__main__":
    p1 = Person()
    print(p1.name)

    # 访问私有属性
    print(p1._Person__age)  # 类的隐藏属性实际上是将名字修改为：_类名__属性名
    print(p1.getAge())  # 在类的内部访问

    # 访问受保护属性
    print(Person._sex)
    print(p1._sex)

    # 调用私有方法
    p1._Person__privateMethod()
    Person.invokePrivateMethodByClassMethod()
    Person.invokePrivateMethodByInstanceMethod(p1)
    p1.invokePrivateMethodByInstanceMethod()

    # 调用受保护的方法
    p1._protectedMethod()
    Person._protectedMethod(p1)